ML -}  X c0C)HCCH Mhhݩh `eCDiCD`  RyHP   * 1H0芢@) Y0.Ș` i #(PMR\ \b Pgi 0  % @ / ՠ`d   0DDԝLX$$L2L3%L:+LU%L'L'L'L'$/$L;(LLLLLL[*Lf*0$G$L'L)(L)L(L)L!'L,L*H$_$L'L&L&L&L&L,*LC*L&`$w$L'L&L}&L/L0L,L-L-x$$L.L--L0L0L)L)Lu%L~%$$L%L%L%L%L%L%L%L%$$L%L%L(L(L(L(L,L($$Ll&Lc&LZ&Lu&L&L~&L},L,$$L+L&L&L&L&LR'Lb'L%0$%L'LU0Lp0Lm0L0L0L0L0%%L>1LR1Lg1L1L%1Lp'L~'LA) %.%LX)L0L0L0L2)3%J%2% ɩ}R1%2K%b%2 s'22c%y%捦22` c&z%%0JQ c&A0?F ݥE%%07, `ڥ0.,!%%}" c&0 c&%% c& o. 8` D` "&%% "& "&%& "&Ԑ "& "&ͥ&&о ݥзг }ݥ&2&Фьɛ D&03&I& O&0 `J&_&ԥ`Ɠƒ` ,`&w&Lf& `ڰ%` fڰ` x&& +` } ,L& (۰`&& L* ݢo. fLݨ&& ٥ ` ٥ԅ` &&B VԩL٩P&&pKJ }&'BDEL* ''܆ ,L;( '3'ԅ`U 1%4'J'R1%eɐ1%LN' K'a' )` }, ٠`b'y' ٠ԅԄL٘*/%z''0%``&դԦԑ''&eԅԊeՅeԅԥeթ''`L 'ԨL݆Ԅ' }' , eԥe`@''''Ԅ ,ɛ )' (0` ^( ؐL* (!(ȹɛ"(8(꩛`} ^( ,9(O(ɛ摥P(f(0L=(`2 g(}(2L*',~((ɛM'M' (ɛ}(( (򩀅((` ٥ԍ`((LنԄLن((ɛԆ( )Lن ,}󅐅 )!) ;( ؐ`ԅԥՅL8")7)2ԭ2Lن8)N)` , eO)e)ԥe` , )f)})}ԄզՄ~))FԐ eਊe&ԆՕ))fؐ ԅԩՅ`؄֬))ע )Ե 8))`R1%} )))L*`GHFH` [*) *0ɛȄ ؐL* * *ɛ )`!*8* )` ٦HI9*P* B}L*՝HIQ*g* *L?Y* *h**򦅩H ID**EB Vú**l/% l+dd}1**l+8/ i m+ 0n+**d+ *2%:+ ***++2%' ) !'+* +8+ , +!+L*q+ *} f*ɛD%"+9+C` ذ l S+L2:+O+ S++ *L + S+ P+L +P+d+l p &8`e+q+ERROR- r++?Run addres}s> Trace:++BASIC exit++]V 8@8e0P ++4)0u++0)JJJJ0++u0 b}إL+ , D`8`I`Դ ,#,` ,L*$,;, )ԩ-ȘH h<,R,00,)S},j,`@?"6?Dk,,'8h4d=u#@(>3,,3 ffff@e?1 b?,,@W)WyQB'h ҅ԭ Ҳ,,) ٢,} L( ,,,L, ݢ',, , / .1, - ݥ)ԩ 0`H-%- ޢ + hԅ`&-=-} L*0t8??>-T-Ԣ ݢh, +b,U-j- fک ݢk-- , (ۢ fڢ\,-- (n }, ݙ-- +e)`--, L( -IԢ.-- fL- -I-->LZ.BL$-, - . + } ٥j `.#.IԢ, +ԕ$.9. +n, @ݢ:.Q. + +R.i. fn +`r&}j..DE@@u"%@2P9?..R5wV@W3@qU?&yI$@..s P?s Pu?P..`H)..Ԣo. .} ,o. (... .E ./. fڢ ݢ /'/. u&. c&. c&(/?/ l& &)>^}@/W/ + ݢo.X/n/ @ݢ ݢ ݢc.o// @ݢ (ۢ +// + fڭ//I } mi{//i. fhIԥ// , +`LDڥ)D//@D o./0 ``ԅL٥I`0(0!}o. (``)0@0 & ٢`BԝK)I A0S0JQD0EL*S:U0l0)H)h y`m00 , , ٥T"}UՅV00`&B *Nԩ՛00 ݦLԽML ,00 , ٠%LM00ԝNBL* , 1` 00BH#}IL* , 1`01B JKL* ٥1&1UՅV , ٥ԅT`'1=1 H )hҘ`>1T1 ٥)xԩL $}U1k1))L%L% ٥l11)pԩL ٥Ԅ11)|L%L% 12%11L + 1 1 1 `2~%}2a6a6788 $a6 $7 $$g6 $7 $$m6 $7 $$L2M7 $6 $7 $7 $7 $$7 $8 $7 $8 $$&}222 %7 $8 !$ $` 46 $ $ $6 $ $6 $8 $$ 28 $6 $L2 <2 2L27 $8 $$8'} $8 $$2~38 $ 8 $88 $$8 $&8 $88 $7 $$8 $&8 $88 $$8 $ 8 $88 $8 $$6 $7(} $7 $$8 $,833 $$7 $7 $88 $$8 $8 $88 $ {$28 $$7 $6 $ ~$ {$8 $$28 $7 $)}8 $$6 $L48 $ $3}48 $$28 $7 $6 $ ~$ {$7 $$28 $8 $$6 $LT47 $ $7 $$,8*} $6 $Lz47 $ $7 $$6~44 $ o$6 $L47 $ $7 $$8 $ $8 $$6 $7 $7 $$6 +}$7 $$8 $6 $8 $$M`L$64{5 E$ <$à6 E$ <$ܠ6 E$ <$6 E$ <$ <$7 E$ <$,}A7 E$ <$ <$k7 E$ *$ 6$ 8 $$ 6$&8 $$|55 8 $ 8 $88 $$&8 $&8 $88 $28 $$7 $ 8 $2}N@  )?HI Y0`HIJH) * J j * hJJJ )HJ h i     .} YS S0 i`΢ϣ߳H J3xj2h/} 1 |9 ӭ45(420 * (0241өX.`  R *i)Lvw  ~*P0}E 5 LN(G E  r s k rsrL ( E LO(0d( L iE0O +)$IC  H S8 1}q p h   j 8no CDLQ CFl M  LO Ri)Llk2'")*F2}$F$F$F$F$ 5 )ШF/Șl]kpqС,LQ/A! Ti)Zlk@ ܬ/i)(")")k3}$F$F$F 5$/L /lF@jj(LNkle$$%8(k()` R 8 ELO Ri)^>jf | NrC s 4} ) vw5g   enfo Glvw LQ@iLm>j FL ~Jjjjii p qEh5}jlrs`LQ:$ȱ$@+[_#{ 8  Խut! ai 8   E I   ] C6} H h    ˰ 8  N   Lm E  ,  [ `LQ ,/ 8 ~/  Ơ? ѩ7}/  [ /Lj0?MoLn FjMqLp NklLOLQnLoMlNLO R"(+8}ըHH`Q R!!  % !   / .   FȑF! /GF \H"+0+* 9}! F tLQnm: J~nTF1F  *n+)5! n (, n)1JJJn(n*o:} I ,0  ci a oF? @ , 8,0 ʩ0H Eh   i;}  D ]DmmFLQvtu`*&!*@h ] 0 ^0` c 0l$$%<}()()%*&J%H,@hH hH@,h $% 8i8$(%)0hhH ]h`() c 0H c 0 h=}`hhh&JJ ](ll  LQ0  /qnoHH 9 9 H H  I9  9 >} Nd EH  Q8 o n  FnoL HII/ Ih8`h`Lnon`no`u F ?}E VEhLO/luF l0BF/lɜɛ׽hE N  b VFL FREE SECTORS C@} H) *Fh ):FȽ F FC IH' 0 d  i:Fȩ/F.l`CD/08HDICA}IHȰ/F`ȱ$>.+.i ȱ$:刄H !A \ Hȱ$*?ȝ 2. ? [_{ ,0B}-:) 0$:>WI  IТ,LQH  0hLd ~ t u`C ?( 0(C.` E C} R =! .ti S0N EE D XC )0')AY  )ע ? 0E088FG \oD}n  (HhLcL3 iJ i Lqp 0=rspnqopqlk`jZj0  j FL`HE}FhȑFȽlFi0 h FFLFpvqwgneofLF pq7  G0i 0 FJJh1FqȱFpȱFk`B!F}08`hEE D 8. =D}tui( TʩL`b!)    cȌaȌd b`aabG}H8 hdaHcd8 cH hHH  \h hc` =Hh I8ih( t  ( t(!` L\H}CJfCJfCJfCDfC` a  HII  INdh  `h  `n)8jHniPoijIjFIjFIjh` aI} I 38  8H0 I  ' H LQ8j Y  8j NdY  &I &I &IHeH.pJ}Iiq  `!.莿 2Jjj }.m Ȉ!m FG` ɩLQ z K} e Hi04 \ Ȍ  8 i h !`I0 `C Y8.`DOS SYSL} I  ` ~ݩ.C/`ba.m۩mѤC9 `C L] H  ,- '0 l M}, BLVDE`D1:AUTORUN.SYS8hhJ ȱHȱIȱBȱDȱEeeHHLV)  N}1*  ,,p-  0 I &  '0   Lw)l, 0  I&LD1:MEM.SAVO}E:D1:DUP.SYS\ E FsVAb@*6qY L晀(Q"bX1 DHP}d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%Q} DD˙`  }J)Lr J  ((  p L ()   JR}L= ( L 0q A    IB JC;? D W S} LL  ` W )LA!  ߰")-݆ p" T} $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ`U}$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H V}p h  hyhy D L> L JJ    ! LA*` BFW}7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!LX}EE !E^ ^ E E7EȩEdE/EȩE  DY} .L }  ;F d  ;?F7F? ( .   Z D LL d Z} . D  L    p  E` , d)  D L) 0BM݊L݉[} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G\} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G]} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISKk}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU l} L ? .  t`GBJ ~DEHI B V0dVm}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEhn}DEL8HI4 0 HI,0 0  9 .G VLOo},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHIp} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHIq} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO r}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -s}LLu ÝDEHILV 9 .l 9 .l  `` s$B BHt}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDGv}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRESw}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N'x}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx y}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECTz} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL{}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD|}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.}}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC~}COPY--FROM, TO?OPTION NOT ALLOWED697 FREE SECTORS COPYING---D8:COPY32.COMl# 0|D .L/%#}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E }1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A}LLOWED IN DESTINATION 0 <.|K PDBUFLO QDBUFHIO> PDBUFHIX;#DAU }X1;;increment sector HCOUNT #DAUX2X;&"COUNT"TEMPLO;;decrement count0 HLOOP: "TEMPHID ILOOPN:;;all doneDAU z* INCOMING!!* By Conrad Tatge 1985 Hi Katie!* Copyright (c) 1986 ANALOG ComputingLIST-L* Simple macros/equatesMO}VMACROfrom,toLDA%1STA%2ENDMZERMACROlabelLDA#0STA%1ENDMADDMACROvalCLCADC%1ENDMSUBMACROval}SECSBC%1ENDMMADMACROlabel,locMOV#LOW %1,%2MOV#HIGH %1,%2+1ENDMPMBASE=$D407SIOINV=$E465VDSLST=$20}0SDLSTL=$230GRACTL=$D01DGPRIOR=$26FSETVBV=$E45CNMIEN=$D40ECOLBK=$D01ASYSVBV=$E45FM0PF=$D000M0PL=$D}008P0PF=$D004P1PF=$D005SIZEM=$D00CPMCOL0=$D012COLOR0=708COLOR1=709COLOR2=710COLOR3=711COLOR4=712C}ONSOL=$D01FAUDF1=$D200AUDC1=$D201AUDF2=$D202AUDC2=$D203AUDF3=$D204AUDC3=$D205AUDF4=$D206AUDC4=$D207}AUDCTL=$D208RANDOM=$D20AHPOSP0=$D000HPOSM0=$D004HITCLR=$D01EWSYNC=$D40AATRACT=$4DSTICK=$278STRIG=$}284DMACTL=559* Program constantsTOP=20;PM top of GR.7 screenTITOFF=68;down the screenMESLEN=20;length of ea}ch messageINCOME=7*MESLENGAMOVR=6*MESLEN;message numbersHIGHSC=5*MESLENSELECT=3*MESLENLEFT=$30;the PM side o}f screenYMAX=85;number of GR.7 linesXMAX=160NUMPAR=19;array size constants-1NUMEXP=63NUMCHO=7NUMBLO=5NUM}SHO=15NUMBOM=3MANLIV=1;aliveMANCHU=8;has chuteMANZER=$10MANLAN=$18;landedHTBLOK=6;heightsHTPARA=5}GROUND=YMAX-HTBLOK-2;where to landCHEXCL=1;charactersCHPER=$0ECHCOM=$0CCHCOL=$1ACHLPAR=8CHRPAR=9COLMSK}=$40;for textCLOUDY=2;clouds on?TRISPD=5;trigger speedSCRMEM=$6000;memory allocationPMBAS=$5C00MISL=PMBA}S+$180PLR0=PMBAS+$200PLR1=PMBAS+$280PLR2=PMBAS+$300PLR3=PMBAS+$380ORG$80VARBEGLODS1;pointerHIDS1XPL}OTDS1;where to plotYPLOTDS1XEXPLODS1;where to explodeYEXPLODS1XDRINTDS1;shot deltasXDRDECDS1YDRINTDS1}YDRDECDS1NEXPLODS1;next pixelCHORATDS1;rate of choppersCOUNTDS1PARNUMDS1SHONUMDS1KILNUMDS1;the paratro}oper to killCHONUMDS1CORDDS1LEVELDS1LEVDONDS1;level is doneJIFFYDS1;tenths of secondsCHANCEDS1EXPLOCDS}1;explosion countFALVELDS1DLIPNTDS1;DLI pointerTIMERDS1EXPTIMDS1EXPSPDDS1EXPMINDS1EXPMAXDS1EXPANDDS}1TRITIMDS1;countdown for triggerSHOTIMDS1;to move shotsSHOSPDDS1;reset value of SHOTIMTITLSTDS1;title line on}?GUNROTDS1;gun positionCHOPSDS1;helicopters flyingCHONSCDS1;on screenCHOCMPDS1BLASNDDS1PARASDS1;trooper}s in airBRIGHTDS1;brightness of exploLOWCMPDS1MESMAXDS1NOTVOLDS1NOTNUMDS1BLADEDS1;blade animationBLATIM}DS1BOMRESDS1BOMTIMDS1;bomb delayBOMNUMDS1;bomb numberBOMSIZDS1;for DLI displayBOMOFFDS1DOTIMEDS1;clock} on?SHUTLEDS1;doing shuttles? 2=cloudsDEADDS1MPLORDS1XALTERDS1LIVINGDS1;for counting landedCOLSKYDS1;col}or of skyMPFORDS4;collisionSCOREDS2;currentHSCOREDS2;highVARSND;sound variablesSCREAMDS1;man yelling?TUN}EONDS1;charge?LOWESTDS1;lowest man/bomb fallingSHOVOLDS1BINGSDS1RIPSNDDS1CHUSNDDS1BWOOOPDS1CHOHITDS1}VARENDORG$2C00* Text for screen displayTEXTDB0,0,0,0,0,'incoming'DBCHEXCL OR $40,CHEXCL OR $40DB0,0,0,0,0D}B0,0,0,0,0,0,CHLPAR OR $40DB'c',CHRPAR OR $40,0,$11,$19DB$18,$15,0,0,0,0,0,0DB0,0,'by',0,0,'conrad',0DB'tatge',0},0DB's' OR $C0,'e' OR $C0DB'l' OR $C0,'e' OR $C0DB'c' OR $C0,'t' OR $C0,0DB'initial',0,'level'DB'press',0DB}'s' OR $C0,'t' OR $C0DB'a' OR $C0,'r' OR $C0DB't' OR $C0,0,'to',0,'begin'DB0,'high',0,'score',CHCOL,0DB0,0,CHCOM,}0,0,0,0DB0,0,0,0,0,'game',0,0,'over'DB0,0,0,0,0DB0,'incoming',0,0,0,0,0,0,0DB0,0,CHEXCL OR $40,0* Display list }for game screenGAMEDLDB$70,$70,$70,$C6DWSCORLNDB$4DDWSCRMEMDB$0D,$0D,$0D,$0D,$0D,$0DDB$0D,$0D,$0D,$0D,$0D,}$0DDB$8D,$0D,$0D,$0D,$0D,$0DDB$0D,$0D,$0D,$0D,$0D,$0DDB$0D,$0D,$8D,$0D,$0D,$0DDB$0D,$0D,$0D,$0D,$0D,$0DDB$0D,$}0D,$0D,$0D,$8D,$0DDB$0D,$0D,$0D,$0D,$0D,$0DDB$0D,$0D,$0D,$0D,$0D,$0DDB$8D,$0D,$0D,$0D,$0D,$0DDB$0D,$0D,$0D,$0D,$0}D,$0DDB$0D,$0D,$0D,$0D,$0D,$0DDB$0D,$0D,$0D,$0D,$0D,$0DDB$0D,$0D,$0D,$0D,$0D,$0DDB$0D,$41DWGAMEDL* Set up lo}okup table, erase screenSETSCRMADSCRMEM,LOLDX#0;set up lookupSETTABLDALOSTASCRLO,XLDAHISTASCRHI,XINX}CPX#YMAX+1;bottom yet?BEQENDSETLDALOADD#40;40 bytes/lineSTALOLDAHIADC#0STAHIJMPSETTABENDSETRTS}ERALINLDA#0;for falling throughDRALINPHAJSRSETLO;set it upPLALDY#39;bytesERALN2STA(LO),Y;do it!DEYBP}LERALN2RTSCLRSCRLDX#YMAXCLEAR2JSRERALIN;erase screenDEXBPLCLEAR2LDX#YMAX-2;draw groundLDA#$FFJSRDRA}LININX;two linesLDA#$FFJSRDRALINRTS* Clear sound channelsSHUTUPLDX#6LDA#0HUSHSTAAUDC1,XDEXDEXBP}LHUSHRTS* Clear out PM buffersCLRPLRLDX#$7FLDA#0CLR2STAMISL,XSTAPLR0,XSTAPLR1,XSTAPLR2,XSTAPLR3,X}DEXBPLCLR2RTS* Draw paratrooper image Y on screenDRAMANLDXPARVER,Y;verticalJSRSETLOLDAPARTYP,Y;image numb}erAND#MANLAN;just pic bitsTAXTYAASLATAYMOV#6,COUNT;6 bytes to moveCLC;through out loopMOVMANLDAPARLEF},X;draw new manSTA(LO),YINYLDAPARRIG,X;and right sideSTA(LO),YTYAADC#39;down one lineTAYINXDECCOUNT};6 times onlyBNEMOVMANRTSSETLOLDASCRLO,X;SCRMEM to LOSTALOLDASCRHI,XSTAHIRTS* Point LO to pixel XPLOT},YPLOT and* set up X and Y properlyPLOTLDXYPLOTJSRSETLO;point to lineLDAXPLOT;0-159PHALSRALSRA;0-39TA}Y;point to bytePLAAND#3TAX;point to pixelLDA(LO),YRTSZEROITJSRPLOTANDBITAND,X;return pointSTA(LO),}YRTSBITSONDB3,$0C,$30,$C0BITOFFDB$FC,$F3,$CF,$3FBITANDDB$3F,$CF,$F3,$FC;mask offPLOTITJSRPLOTANDBITAND,X};return pointORABITPF1,X;mask onSTA(LO),YRTSBITPF1DB$40,$10,$04,$01;COLOR 1BITPF3DB$C0,$30,$0C,$03;COLOR 3}* Returns color at XPLOT,YPLOTLOCATEJSRPLOTANDBITPF3,XPHA;save byte at coordsTXAEOR#3;flipTAXPLASHIFT}DEX;countdownBMIENDLOCLSRALSRAJMPSHIFTENDLOCRTS* Check pixel XPLOT,YPLOT and take* action. Called by SHO}TS and EXPLO* A is fate of pixel (NE or EQ)NEWPIXJSRLOCATE;what is at pixel?CMP#2;hit anything?BCCPLOPIXTAY;}Yes! save color hitLDAXPLOTLSRALSRALSRA;0-19TAX;find PARatrooperLDAYPLOT;is pixelSECSBC#HTBLOKCMP}LANDED,X;too low?BCSKILPIXCPY#3;hit chute?BNEMANHIT;no.LDA#MANLIV;take off chuteSTAPARTYP,XLDAFALVEL;}give speedLSRALSRASTAPARSPD,XSTAPARVEL,XLDA#5JSRADDSCO;add 50 pointsMOV#9,RIPSNDJMPKILPIXMANHITJS}RKILPARMOVXPLOT,XEXPLOMOVYPLOT,YEXPLOLDA#7JSRINIEXP;boomKILPIXLDA#0;kill pixelRTSPLOPIXJSRPLOTIT;do }the new pointLDA#1;pixel is OKRTS* Move all live shots according to DRSHOTSDECSHOTIM;times yet?BEQMVSHOTRTS};not time yet!MVSHOTMOVSHOSPD,SHOTIM;resetLDX#NUMSHO;up to 16 bulletsSTXSHONUMCKSHOTLDASHOLIV,X;shot here?}BEQNXSHOTLDASHXINT,XSTAXPLOTLDASHYINT,XSTAYPLOTJSRZEROIT;erase old pointLDXSHONUM;retreiveLDASHXDEC},X;horizontalADDXDRDECSTASHXDEC,XLDASHXINT,XADCXDRINTCMP#XMAX;off of screen?BCSKILSHOSTASHXINT,XSTA}XPLOTLDASHYDEC,X;and verticalADDYDRDECSTASHYDEC,XLDASHYINT,XADCYDRINTCMP#YMAXBCSKILSHOSTASHYINT,XS}TAYPLOTJSRNEWPIX;checkLDXSHONUMSTASHOLIV,X;kill it?NXSHOTDECSHONUM;next!LDXSHONUMBPLCKSHOTRTSKILSHO}LDA#0STASHOLIV,X;kill shotBEQNXSHOT;leave...* Init an explosion at XEXPLO,YEXPLO* of the size in the accumulator}INIEXPSTACOUNT;save sizeLDXNEXPLO;maximum 64 pixelsCKEXPLDAEXPLIV,XBEQINEXPLJSRERAEXP;erase pointLDXNEXP}LO;restoreINEXPLLDARANDOM;directionANDEXPAND;could be just upSTAEXPDIR,XLDAXEXPLO;explosion pointSTAEXPXP,}XLDAYEXPLOSTAEXPYP,XJSRGETRANSTAEXPXI,X;incrementsJSRGETRANSTAEXPYI,XLDA#0STAEXPXAC,X;accumulators}STAEXPYAC,XJSRGETRAN;length of lifeANDEXPMAXSTAEXPLIV,XINCNEXPLOLDANEXPLOAND#NUMEXP;0-63STANEXPLOT}AXDECCOUNTBNECKEXPMOV#$0F,BRIGHTINITEXMOV#3,EXPAND;restoreMOV#7,EXPMIN;explo varbsMOV#$3F,EXPMAXRTSG}ETRANLDARANDOM;random betweenORAEXPMIN;minimumRTS* Erase explosion pixel XERAEXPLDAEXPXP,XSTAXPLOTLDAEXP}YP,XSTAYPLOTJSRZEROITRTS* Update the explosionEXPLODECEXPTIMBEQSETEXPRTS;not yet!SETEXPMOVEXPSPD,EXP}TIM;resetLDX#NUMEXP;do 64STXEXPLOCDOEXP1LDAEXPLIV,X;pixel moving?BEQJXEXPLJSRERAEXP;erase the oldLDXEXP}LOC;restoreDECEXPLIV,X;now done?BEQJXEXPL;yes...leaveLDAEXPXI,X;a new point!CLCADCEXPXAC,XSTAEXPXAC,XL}DAEXPDIR,X;directionAND#1BNEADDEXXLDAEXPXP,XSBC#0;with carry!JMPSTOEXXJXEXPLJMPNXEXPLADDEXXLDAEXPXP},X;ends up hereADC#0STOEXXCMP#XMAX;off of screen?BCSKILEXPSTAEXPXP,X;new point is OKSTAXPLOTLDAEXPYI,X;}now do Y placeCLCADCEXPYAC,XSTAEXPYAC,XLDAEXPDIR,XAND#2BNEADDEXYLDAEXPYP,XSBC#0JMPSTOEXYADDEXYLD}AEXPYP,XADC#0STOEXYCMP#YMAX;off screen?BCSKILEXPSTAEXPYP,XSTAYPLOTJSRNEWPIX;do new pixelBNENXEXPLLD}XEXPLOCSTAEXPLIV,X;killNXEXPLDECEXPLOC;next!LDXEXPLOCBMIENDEXPJMPDOEXP1KILEXPLDA#0STAEXPLIV,XBEQN}XEXPL;alwaysENDEXPRTSDOPLR0STAPLR0+TOP+2,Y;this is aSTAPLR0+TOP+16,Y;ridiculousSTAPLR0+TOP+30,Y;waste butST}APLR0+TOP+44,Y;it works!RTSDOPLR1STAPLR1+TOP+2,YSTAPLR1+TOP+16,YSTAPLR1+TOP+30,YSTAPLR1+TOP+44,YRTSDOPLR}2STAPLR2+TOP+2,YSTAPLR2+TOP+16,YSTAPLR2+TOP+30,YSTAPLR2+TOP+44,YRTSDOPLR3STAPLR3+TOP+2,YSTAPLR3+TOP+16,Y}STAPLR3+TOP+30,YSTAPLR3+TOP+44,YRTSWAITVBLDATIMER;wait for VB to endWAITITCMPTIMERBEQWAITITRTSSILENTLD}X#VAREND-VARSND-1LDA#0KILSNDSTAVARSND,XDEXBPLKILSNDRTS* Erase old paratrooper X and draw a* new one lower. }See if this guy* has landed. Called by MOVPAR.SHOPARSTXPARNUM;hold me nowTXAASLATAY;horizontalLDAPARVER,X};verticalTAXJSRSETLOLDA#0STA(LO),Y;erase 2 bytesINYSTA(LO),YDEY;put backLDXPARNUMINCPARVER,X;grav}ityLDAPARVER,XCMPLANDED,X;has he landed?BCCSHOHIMLDAPARTYP,X;yesAND#MANCHU;have chute?BNESAFETYJSRKIL}PAR;no. kill him!LDALANDED,XCMPROOF,X;anyone below?BEQENDMAN;noLDALANDED,X;yesADD#HTPARA;move down manS}TALANDED,X;adjust downSTAPARVER,X;erase manJSRKILPARJMPENDMANSAFETYLDALANDED,X;adjust groundPHA;oldSUB}#HTPARA;move up oneSTALANDED,XLDA#MANLAN;raise handsSTAPARTYP,XJSRBASHIT;on base?LDXPARNUMPLA;on build}ing?CMPROOF,XBNESHOHIMCMP#GROUNDBEQSHOHIMJSRCHARGESHOHIMLDYPARNUM;get man to drawJSRDRAMANENDMANLDXP}ARNUMRTS;X reg is intact* Kill paratrooper X (intact)* by zeroing PARTYP and erasing.KILPARSTXKILNUM;save the num}berLDA#MANZER;erase this guySTAPARTYP,XTXATAYJSRDRAMANLDXKILNUMLDA#0STAPARTYP,XTXAASLAASLAAS}LAADD#3STAXEXPLOLDAPARVER,XADD#3STAYEXPLOLDA#10JSRINIEXP;boom!LDA#6;60 points!JSRADDSCOMOV#1}2,SCREAMLDXKILNUMRTS* Move these guysMOVPARZERPARASSTALOWCMPLDX#NUMPAR;do paratroopersDOPARLDAPARTYP,X};guy hereAND#MANLIV;to move?BEQNXTPARINCPARASLDAPARTYP,X;chuteless?AND#MANCHUBNEHASCHULDAPARVER,XCMP}LOWCMP;lower?BCCHASCHUSTALOWCMPHASCHUDECPARVEL,X;countdownBNENXTPARLDAPARSPD,X;resetSTAPARVEL,XLDAPA}RVER,XCMPCORDBNENXPARLDA#MANCHU OR MANLIV;open!STAPARTYP,XLDAFALVEL;slow him down!STAPARSPD,XSTAPARVEL},XMOV#5,CHUSNDNXPARJSRSHOPAR;move and draw himNXTPARDEXBPLDOPARMOVLOWCMP,LOWESTRTS* Update the helicopters}: Create new* chopper? Kill if necessary!* Drop a paratrooper or a bomb?MOVCHOZERCHOPS;populationLDASHUTLECMP#}CLOUDYBNENOTCLOLDX#7BNESTCHNMNOTCLOLDALEVEL;max of 8 choppersLSRAORA#1TAX;evenSTCHNMSTXCHONUMDOCHO}JSRMOVEM;move objectLDXCHONUMLDACHOSPD,X;move?CMPCHOVEL,XBNEJNXCHOLDADOTIME;done?BEQJNXCHOJSRMAYBE};drop time?BCSJNXCHOLDASHUTLE;shuttles?BEQDOCHOPCMP#CLOUDY;clouds?BEQJNXCHOLDACHOPOS,X;on screen?SUB# }LEFTCMP#XMAX-16BCSJNXCHOLDALEVELLSRALSRATAXCKBOMSLDABOMLIV,X;exists?BEQDROPITDEXBPLCKBOMSJNXCHO }JMPNXCHOP;bag itDROPITLDYCHONUMLDAALTVER,YCMPLANDED,YBCSJNXCHOPHAJSRERAOLDPLAADD#TOPSTABOMYP,X }LDA#0STABOMYI,XSTABOMYAC,XSTAMPFOR,XLDARANDOMAND#3ADD#2STABOMSPD,XSTABOMVEL,XLDYCHONUMLDACHOPO }S,YADD#4;centerSTABOMXP,XSUBBASPOS;baseAND#7BEQSTBDIR;straight?LDA#0ROLAEOR#1TAYLDACHODIR,Y; }directionSTBDIRSTABOMDIR,XINCBOMLIV,X;drop bomb XMOV#5,BWOOOP;soundBNENXCHOPDOCHOPLDACHOPOS,XSUB#LEFT-8}LSRALSRALSRATAX;correct columnCPX#20BCSNXCHOPLDAPARTYP,X;trooper?AND#MANLIVBNENXCHOP;existsLDY}CHONUMLDAALTVER,Y;get VERCMPLANDED,XBCSNXCHOPSTAPARVER,XLDAFALVELLSRASTAPARSPD,X;rate of fallSTAPAR}VEL,XLDA#MANLIV;existsSTAPARTYP,XJSRSHOPAR;and draw himNXCHOPDECCHONUM;loop countBMIENDCHOLDXCHONUMJMP}DOCHOENDCHOMOVCHOPS,CHONSCRTSMAYBELDARANDOMORARANDOMCMPCHANCERTS* Move chopper or shuttle X* and check} collisionMOVEMLDACHOLIV,X;alive?BEQNEWCHOINCCHOPSDECCHOVEL,X;move yet?BNECKCHOPLDACHOSPD,X;restoreST}ACHOVEL,XTXAAND#1TAYLDACHODIR,YCLCADCCHOPOS,XSTACHOPOS,XBNECKCHOPLDASHUTLECMP#CLOUDY;cloud?BEQ}ENDMOVLDA#0STACHOLIV,X;killCKCHOPLDASHUTLE;don't kill cloudsCMP#CLOUDYBEQENDMOVLDAKILL,X;was he hit?B}PLENDMOVLDACHOPOS,XSUB#LEFT-8STAXEXPLOLDAALTVER,XSTAYEXPLOLDA#0;now zero chopperSTACHOPOS,XSTACHOLI}V,XLDA#25JSRINIEXPLDA#6;60 pointsJSRADDSCORTSNEWCHOLDADOTIMEBEQENDMOVLDATIMERAND#$0FBNEENDMOV}JSRMAYBEBCSENDMOVLDARANDOMAND#$0FADDCHORAT;reappearSTACHOVEL,XSTACHOSPD,XLSRALSRASTAKILL,X;res}istINCCHOLIV,X;it livesENDMOVRTS* For missile work...ERAOLDLDABOMYP,X;erase bomb XTAYDEYJSRMISZER;7 byte}s!JSRMISZERJSRMISZERJSRMISZERJSRMISZERJSRMISZERJSRMISZERRTSMISZERLDAMISL,Y;bits offANDBITOFF,XS}TAMISL,YINY;nextRTSMISONELDAMISL,YORABITSON,XSTAMISL,YRTS* Move the bombsBOMBSDECBOMTIM;time yet?B}EQSETBOMRTS* Reset the time and move 'emSETBOMMOVBOMRES,BOMTIMSTABOMTIMZERLOWCMPLDX#NUMBOMSTXBOMNUMDOB}OMBLDABOMLIV,XBNELIVBOMJMPBOTBOMLIVBOMLDAMPFOR,X;hit the ground?AND#$0E;exclude shot PF0BEQDOFALLLDABO}MXP,XSUB#LEFT-3LSRALSRALSRATAXCPX#NUMPAR+1;make sure!BCSJBOTBMLDALANDED,XCMPROOF,XBEQBUILD;an }empty building!ADD#HTPARA;kill the manSTALANDED,XSTAPARVER,XJSRKILPAR;kill manJBOTBMJMPKILLITBUILDTXATA}YJSRDRABLOMOV#25,BWOOOPBNEKILLITDOFALLLDAMPFOR,X;hit?AND#1;shot or exploBNEKILBOMINCBOMYI,X;gravity }LDABOMYI,XCLCADCBOMYAC,XSTABOMYAC,XBCCXBOMB;increment?INCBOMYP,X;move downLDABOMYP,X;redrawTAYCMPLO!}WCMP;make sound?BCCMOVDOWSTALOWCMPMOVDOWJSRMISZERLDABOMYP,XADD#4TAYJSRMISONEXBOMBDECBOMVEL,X;time?"}BNEBOTBOMLDABOMSPD,XSTABOMVEL,XLDABOMDIR,XCLCADCBOMXP,XCMP#LEFTBCCKILBOMCMP#LEFT+XMAX-6BCCSAVBOMK#}ILBOMLDABOMXP,XSUB#LEFT-3STAXEXPLOLDABOMYP,XSUB#TOPSTAYEXPLOLDA#20JSRINIEXP;boomLDA#5;50 points$}JSRADDSCOKILLITLDA#0LDXBOMNUMSTABOMXP,XSTAHPOSM0,X;for now...STABOMLIV,XSTAMPFOR,XSAVBOMSTABOMXP,X;ma%}ke sureBOTBOMDECBOMNUMBMIENDBOMLDXBOMNUMJMPDOBOMBENDBOMMOVLOWCMP,LOWESTRTS* Subtract ten points from sco&}reSUBSCOLDASCORE+1;cant't be zero!ORASCOREBEQENDSCOSEDLDASCORE+1SUB#1;minus 10 points!STASCORE+1LDA'}SCORESBC#0;carrySTASCOREJMPSHOSCO* Add value of accumulator to scoreADDSCOSED;for scoringADDSCORE+1STAS(}CORE+1LDASCOREADC#0;carry overSTASCORESHOSCOLDY#1LDX#4SHO1LDASCORE,YJSRSHOHEXDEX;skip over comma)}DEYBPLSHO1CLDENDSCORTSNEXLEVINCLEVEL;add oneLDALEVELAND#$0FSTALEVELASLAASLAASLAASLASTACOL*}SKY;for DLISTACOLOR4;backgroundSHOLEVLDYLEVELLDABCD,YLDX#19;upper right corner* Show accumulator as a hex at+} XSHOHEXPHAAND#$0FJSRSHODIGPLALSRALSRALSRALSRASHODIGORA#COLMSK OR $10STASCORLN,XDEXRTSBCD,}DB1,2,3,4,5,6,7,8,9,$10DB$11,$12,$13,$14,$15,$16* Add a building at YDRABLOTYA;hit the base?JSRCHECKBBEQENDB-}LO;no drawLDAROOF,Y;adjust roofCMPALTVER+6;too high?BCCENDBLOPHATAXJSRSETLO;pointPLASUB#HTBLOKSTA.}ROOF,YSTALANDED,YTAXTYAASLATAYLDX#5CLCDRABL2LDABLOPIC,X;draw the blockSTA(LO),YINYSTA(LO),YTYA/}ADC#39TAYDEXBPLDRABL2ENDBLORTS* Building graphicBLOPICDB$C3,$C3,$FF,$C3,$C3,$FF* Set up landing blocks at0} bottomSETBLOLDX#NUMBLOGETRNDLDARANDOMAND#$1F;0-31CMP#20;0-19BCSGETRNDTAYLDALANDED,Y;taken?CMP#GRO1}UNDBNEGETRNDSTXXREG+1;self modifyJSRDRABLOXREGLDX#0;gets modifiedDEXBPLGETRNDRTSCHARGEMOV#6,NOTNUM2}STATUNEONRTS* Check all the buildings...set DEAD* if half are occupied.CKDEADLDX#NUMPARLDY#0CKDED2LDAROOF,X3};building?CMP#GROUNDBEQCKDED3INYCMPLANDED,X;or man?BEQCKDED3DEYDEYCKDED3DEXBPLCKDED2DEYBPLBASEOK4}MOV#1,DEAD;you're out!BASEOKRTSCHECKBCMP#9;do a double checkBEQENDCKCMP#10ENDCKRTS* Has the base been hi5}t by a trooper?* Called by SHOPAR to stop gun.BASHITTXAJSRCHECKBBNEENDCKSTXDEAD;killSTXLEVDON;no shooting6}ZERDOTIME;stop gameSTABASPOS* Blow the base up real goodBLOBASMOV#1,EXPANDMOV#7,EXPMINMOV#$FF,EXPMAXMOV#7}79,XEXPLOMOV#GROUND+3,YEXPLOLDA#[NUMEXP SHR 1]+1;halfJMPINIEXP;that's itKILBASMOV#CLOUDY,SHUTLESTALEVDON;8}killZERDOTIMEJSRSILENTJSRSHUTUPLDX#$7FERAMISSTAMISL,X;erase bombsDEXBPLERAMISSTABASPOSMOV#4,EXPSPD9}BLOBLOMOV#19,XALTERBLOBL2LDXXALTERLDALANDED,X;blow 'em up!CMP#GROUNDBEQNEXBLOADD#3STAYEXPLOTXAASL:}AASLAASLAADC#3STAXEXPLOMOV#1,EXPANDLDA#3JSRINIEXPNEXBLODECXALTERBPLBLOBL2BMISETWAIBOOMJSRBL;}OBASMOV#$80,TIMERBNEENDGAMJULY4LDARANDOM;fireworksAND#$7FADD#16STAXPLOTSTAXEXPLOLDARANDOMAND#$3F<}STAYPLOTSTAYEXPLOJSRLOCATECMP#2BCSJULY4LDA#16JSRINIEXPSETWAILDARANDOMORA#1STATIMERENDGAMJSRWA=}ITVBLDACONSOLCMP#7BNEBASENDJSREXPLOLDATIMERBPLENDGAMLDARANDOMORARANDOMLSRABCSJULY4LSRABCS>}BLOBLOLSRABCSBOOMBASENDMOV#10,EXPSPDJSRBLOBAS;last oneJSRBLOBASJSRFINISH;let finishMOV#GAMOVR,MESMAX?}STATITDL+10LDASCORE;new high score?CMPHSCOREBCCENDBASLDASCORE+1CMPHSCORE+1BCCENDBASSTAHSCORE+1MOVS@}CORE,HSCORELDX#5MOVSCOLDASCORLN,X;move itSTATEXT+[5*20]+13,XDEXBPLMOVSCOMOV#HIGHSC,TITDL+10;pointENDBASJA}MPNEWGAM;try again?* Begin the next levelNEWLEVZERDOTIMELDA#1JSRSETTIM;set minuteLDALEVELAND#1JSRSHOB}CHO;draw choppersLDASHUTLEASLAASLAASLATAYLDX#7MOVOPTLDAEITHER,Y;print typeSTATEXT+[20*7]+10,XINYC}DEXBPLMOVOPTMOV#INCOME,TITDL+10JSRSWITDL;show messageJSRSILENTJSRSHUTUPMOV#$80,TIMERREADITJSRWAITVBLDD}ATIMERBEQCONLEVASLAASLAASLAEOR#$0FBEQREADITSTALOWESTBNEREADITCONLEVSTALOWEST;zeroJSRSWITDL;bE}ackLDXLEVEL;set up levelsLDALEVCHA,XSTACHANCELDALEVRAT,XSTACHORATLDALEVEXP,XSTAEXPSPDSTAEXPTIMTXAF}LSRATAX;0-7LDALEVFAL,X;paratroopersSTAFALVELLDALEVBOM,XSTABOMRESSTABOMTIMTXALSRATAX;0-3LDALG}EVCOR,XSTACORDTXALSRATAXLDALEVSHO,XSTASHOSPDSTASHOTIMLDA#0LDX#NUMPAR;zero databasesZERPARSTAPARTH}YP,X;paratroopersDEXBPLZERPARLDX#NUMBOMZERBOMSTABOMLIV,XSTABOMXP,X;horizontalDEXBPLZERBOMLDX#NUMSHOZI}ERSHOSTASHOLIV,X;shotsDEXBPLZERSHOLDX#NUMEXPZEREXPSTAEXPLIV,X;explosionDEXBPLZEREXPLDX#NUMCHOZERCHOSJ}TACHOLIV,X;choppersSTACHOPOS,XSTAKILL,XDEXBPLZERCHOLDX#NUMCHOSETCOLTXAADD#6ORACOLSKYEOR#$F0STACK}HOCOL,XDEXBPLSETCOLZERNEXPLO;start offSTALEVDON;allow shootingRTSEITHERDB'sreppohc';backDB'selttuhs';L}wardsSWITDLJSRWAITVB;hold on...LDATITLST;OK now swapEOR#6STATITLSTTAXLDY#5DOTITLLDATITDL,XSTAGAMEDLM}+TITOFF,YINXDEYBPLDOTITLLDATITLSTBEQENDTITLDX#NUMCHOMOVCLOLDARANDOMAND#$7FADD#LEFT+7;centerSTACHN}OPOS,XLDARANDOMAND#$0FORA#$0ASTACHOCOL,XDEXBPLMOVCLOENDTITRTSNXTMESLDAGAMEDL+TITOFF+1CMPMESMAXBCCO}MOVMESJSRCHARGEZERGAMEDL+TITOFF+1BEQENDMESMOVMESLDX#19;scrollSCROLLJSRWAITVBINCGAMEDL+TITOFF+1TXAANDP}#1ASLAASLAASLASTAAUDC1STXAUDF1DEXBPLSCROLLENDMESRTSTITDLDB$0D,$0D,$0DDB$0D,$0D,$0D;backwardDBQ}HIGH [SCRMEM+[40*64]]DBLOW [SCRMEM+[40*64]],$4DDBHIGH TEXT,LOW TEXT,$46* Game initializes here...INITZERDMACTLR};execution begins hereSTAAUDCTL;soundsLDX#VAREND-VARBEG-1ZERPAGSTAVARBEG,X;clear 'emDEXBPLZERPAGJSRSIOINVS};soundsJSRSETSCR;set up screenJSRCLRSCR;clear screenJSRCLRPLRJSRSHOSCOJSRZERTIMJSRSHOLEVJSRALTPER;perT}iodJSRINITEXMOV#4*20,MESMAXMOV#TRISPD,TRITIM;for gunMOV#1,LEVDONMADDLI,VDSLSTMADGAMEDL,SDLSTLMOV#HIGH PU}MBAS,PMBASEMOV#3,GRACTLMOV#$11,GPRIORLDX#HIGH VBLANKLDY#LOW VBLANKLDA#6JSRSETVBVLDX#5DRABASLDABASPIC,V}X;draw baseSTAPLR0+TOP+GROUND,XDEXBPLDRABASMOV#$C0,NMIENZERCOLOR0;shots/exploMOV#$CE,COLOR1;'troopersMOW}V#$42,COLOR2;'chutesMOV#$2E,DMACTL;onZERTITDL+10* A new game starts here...NEWGAMZERDEADSTAMPLORSTADOTIX}MEJSRSHUTUPJSRSILENTMOV#$34,COLOR3;red sunLDX#NUMCHOMAKCLOLDARANDOM;create cloudsAND#$0FORA#3STACHOY}LIV,XSTACHOVEL,XSTACHOSPD,XDEXBPLMAKCLOLDA#CLOUDYJSRSHOCHOJSRSWITDL;open a lineLDX#7MOVSUNLDATHESUZ}N,XSTAMISL+TOP+3,XDEXBPLMOVSUNZERTIMERLDARANDOMAND#$7FADD#LEFT+10LDX#3CLCPUTSUNSTABOMXP,XADC#2[}DEXBPLPUTSUNSTAHITCLR;careful!WAITJSRWAITVB;a jiffyLDACONSOLAND#2;SELECT?BNECKSTRTMOV#SELECT,GAMEDL\}+TITOFF+1ZERTIMERJSRNEXLEV;add oneMOV#$10,BINGSWAISELLDACONSOL;let go!AND#2BEQWAISELCKSTRTLDACONSOLA]}ND#1ANDSTRIG;eitherBEQSTARTLDATIMERAND#$7F;switch?BNEWAITJSRNXTMESJMPWAIT;bottom of loopJNEWGMJMP^}NEWGAMSTARTZERSCORESTASCORE+1JSRSHOSCOJSRSWITDL;restoreWAISTRLDACONSOL;let goLSRABCCWAISTRJSRCLR_}SCRMOV#125,BASPOS;place gunMOV#6,JIFFYLDA#0LDX#7ZERSUNSTAMISL+TOP+3,XDEXBPLZERSUNMOV#$2E,COLOR3;bomb`}sLDX#NUMPARLDA#GROUNDZERLANSTALANDED,XSTAROOF,XDEXBPLZERLANLDA#GROUND-HTBLOK;hold baseLDX#1FIXLANSTa}ALANDED+9,XSTAROOF+9,XDEXBPLFIXLANJSRSETBLO;now it's ok* Next level begins here...GAMEJSRNEWLEV;a level bb}egins!MOV#1,DOTIME;start clock upLOOPLDACONSOLCMP#7BEQGAMCONMOV#SELECT,TITDL+10JMPNEWGAMGAMCONJSRMOVCHc}O;choppers/shuttlesJSRSHOTS;do shotsJSREXPLO;explosionLDASHUTLE;shuttles?BNELOOP2;forkJSRMOVPAR;paratrood}persJSRDOBLAD;animationJMPLOOP3LOOP2JSRBOMBS;bombsLDAMPLOR;base hit?BEQLOOP3JMPKILBAS;blow upLOOP3Le}DADOTIME;done yet?BNELOOP;bottom of loopLDX#NUMBOMCKOVERORABOMLIV,X;all of theseDEXBPLCKOVERORAPARAS;muf}st be zeroORACHOPSBNELOOP;wait for thoseMOV#10,EXPSPD;do quicklySTASHOSPDSTALEVDON;no shootingJSRFINISHg}JSRCKDEADLDADEADBNEKILLEMJSRNEXLEV;next level...JMPGAMEKILLEMJMPKILBAS* Let the EXPLOsions and SHOTs quiq}B)FRAC OBJBH-DOS SYSB*uDUP SYSBBACKUP M65BINCOMINGASMBDYNAMIC3M65BAUTORUN SYSBMENU tFINISHJSRSHOTSJSREXPLOLDA#0LDX#NUMSHOCKSHOSORASHOLIV,XDEXBPLCKSHOSLDX#NUMEXPCKEXPLORAEXPLIV,XDEr}XBPLCKEXPLCMP#0BNEFINISHRTS* If time to, animate the bladesDOBLADDECBLATIM;time?BNEENDBLAMOV#23,BLATIs}MLDABLADE;next pictureADD#1AND#3;0-3STABLADETAXLDY#0LDABLLEF1,XJSRDOPLR0LDABLLEF2,XJSRDOPLR1t}LDABLRIG1,XJSRDOPLR2LDABLRIG2,XJSRDOPLR3ENDBLARTS* Draw the helicopters (or shuttles)SHOCHOSTASHUTLETAYu}LDXMULT48,Y;multiply by 48LDY#0CHO2LDACHLEF1,XJSRDOPLR0LDACHLEF2,XJSRDOPLR1LDACHRIG1,XJSRDOPLR2LDACv}HRIG2,XJSRDOPLR3INXINYCPY#12BCCCHO2RTSMULT48DB0,48,96;times 48* Player imagesCHRIG1DB$07,$00,$00,$C0w},$FF,$3FDB$07,$01,$00,$00,$00,$01CHRIG2DB$FF,$20,$78,$E4,$E2,$E2DB$E2,$E2,$FC,$78,$11,$FECHLEF1DB$FF,$04,$1E,$27,x}$47,$47DB$47,$47,$3F,$1E,$88,$7FCHLEF2DB$E0,$00,$00,$03,$FF,$FCDB$E0,$80,$00,$00,$00,$80* Space shuttleSHRIG1DBy}$E0,$F0,$F0,$F8,$FC,$7EDB$7F,$FF,$FF,$FF,$FC,$7BSHRIG2DB0,0,0,0,0,0DB$F8,$E4,$FE,$FF,$1F,$ECSHLEF1DB0,0,0,0,0,0z}DB$1F,$27,$7F,$FF,$F8,$37SHLEF2DB$07,$0F,$0F,$1F,$3F,$7EDB$FE,$FF,$FF,$FF,$3F,$DECLOUDSDB0,0,0,0,0,$0CDB$1F,$1F,{}$F,$3F,$FE,0DB0,0,$30,$78,$FD,$FFDB$FF,$FE,$FF,$FF,$EC,0DB0,0,$0C,$1E,$5F,$FFDB$FF,$7F,$FF,$FF,$37,0DB0,0,0,0,|}0,$30DB$F8,$F8,$F0,$FC,$7F,0BLRIG1DB$04,$06,$03,$01;bladesBLRIG2DB$71,$1C,$06,$C3BLLEF1DB$8E,$C3,$60,$38BLLEF2}}DB$20,$80,$C0,$60THESUNDB$3C,$7E,$FF,$FFDB$FF,$FF,$7E,$3C* ORA the MnPFs togetherORM0PFLDX#3OR2LDAM0PF,X;sav~}e collisionORAMPFOR,XSTAMPFOR,XDEXBPLOR2RTS* The DL interrupt checks shot-* chopper collisions, gives the* c}hoppers color & position and gives* the bombs their expanding effect.DLIPHATXAPHATYAPHACLDLDXDLIPNTLDY#0}DLI1LDAP0PF,Y;chopper hit?ORAP1PF,YAND#1BEQDLI2DECKILL-2,X;hit himLDACHOSPD-2,X;slow down!STACHOHITS}UB#2STACHOSPD-2,XDLI2INXINYINYCPY#4BCCDLI1JSRORM0PFLDADLIPNTADD#2ORACOLSKYSTAWSYNCSTACOLBK};color of skySTAHITCLR;clear collisionsLDXDLIPNTLDY#0DLI3LDACHOCOL,X;show choppersSTAPMCOL0,YSTAPMCOL0+1,}YLDACHOPOS,XSTAHPOSP0,Y;new playerADD#8INYSTAHPOSP0,Y;and rightINXINYCPY#4BCCDLI3STXDLIPNT;upda}te itCPX#6;handle bombsLDABOMSIZROLAAND#3STABOMSIZEOR#3STABOMOFFLDX#NUMBOMFIXSIZLDABOMSIZ;expan}d BOMSIZASLAASLA;for 8 bitsORABOMSIZSTABOMSIZDEXBPLFIXSIZSTAWSYNCSTASIZEM;bomb widthLDX#NUMBOMC}LCSHOBOMLDABOMXP,X;show bombsADCBOMOFFSTAHPOSM0,XDEXBPLSHOBOMPLATAYPLATAXPLARTI* Clock is 0:00.0} set minutes with AZERTIMLDA#0;early entrySETTIMPHA;set clock for minutesLDX#5LDA#0JSRPUTDIGDEX;period}JSRPUTDIGJSRPUTDIGDEX;colonPLAJSRPUTDIGRTS* Clock subroutines for VBLANKALTCOLLDATIME+1;blink punctuat}ionEOR#CHCOL OR COLMSKSTATIME+1ALTPERLDATIME+4EOR#CHPER OR COLMSKSTATIME+4RTSGETDIGDECTIME,X;subtract}LDATIME,XAND#$0FCMP#10;and check overflowRTSPUTDIGORA#COLMSK OR $10;get readySTATIME,XDEXRTS* The ver}tical blank occurs every* 60th of a second to adjust time,* read the joystick, check collisions* and update the sounds.V}BLANKCLDZERDLIPNT;reset DLI pointerSTABOMSIZINCTIMER;general timerLDADOTIME;do time now?BEQCKSTIKDECJIF}FYBNECKSTIKMOV#6,JIFFYLDX#5;tenth of a secondJSRGETDIGBCCCKSTIKLDA#9;reset and borrowJSRPUTDIGJSRAL}TCOL;flopDEX;skip periodJSRGETDIG;do secondsBCCCKSTIKLDA#9JSRPUTDIGJSRGETDIGBCCCKSTIKLDA#5JSRPU}TDIGDEX;skip colonJSRGETDIG;do minutesBCCCKSTIKZERDOTIME;stop clockJSRZERTIM;zero timeMOV#$30,BINGSCKS}TIKLDATIMERAND#3BNECKTRIGLDASTICK;create deltaLSRALSRAEOR#3;flip aroundTAXLDADIREC,XADDGUNROT}CMP#11;no wrapBCSCKTRIGSTAGUNROTTAXASLAASLAASLAASLAORA#8;half shadeSTABASCOLLDACOSDEC,XSTA}XDRDECLDACOSINT,XSTAXDRINTLDASINDEC,XSTAYDRDECLDASININT,XSTAYDRINTTXA;draw new gunASLAASLA;times} fourTAYLDX#3;four bytesSHOGUNLDAGUNPIC,YSTAPLR0+TOP+73,XINYDEXBPLSHOGUN;an NBC showBMICKCOLLCKTRIGD}ECTRITIMBNECKCOLLMOV#TRISPD,TRITIMLDALEVDON;ok to shoot?BEQTRIZERLDASHUTLECMP#CLOUDYBNECKCOLLJSRMOV}CHO;move cloudsJMPCKCOLLTRIZERLDASTRIG;trigger?BNECKCOLLSTAATRACTLDX#NUMSHOCKLIVLDASHOLIV,X;empty?BEQ}DOSHOTDEXBPLCKLIVSTXBASCOLBMICKCOLL;bullets!DOSHOTLDABASPOSEOR#1STABASPOSSUB#LEFT-4STASHXINT,XL}DA#GROUNDSTASHYINT,XLDA#0STASHXDEC,XSTASHYDEC,XINCSHOLIV,XMOV#16,SHOVOLJSRSUBSCO;lose pointsCKCOLLLD}X#3LDAMPLORCKBASEORAM0PL,X;base hit?DEXBPLCKBASEAND#1;just PL0STAMPLORJSRORM0PFSTAHITCLRLDATIMER};sound effectsAND#3BEQBRITNSLDASHOVOLBEQSTAUD1DECSHOVOLMOVSHOVOL,AUDF1ORA#$20STAUD1STAAUDC1JMPDOA}UD2BRITNSLDABRIGHTBEQSTAUD1STACOLOR0;b/wORA#$40STAAUDC1LDARANDOMAND#$1FADD#40STAAUDF1DECBRIGH}TDOAUD2LDATUNEON;playing charge?BEQLOWSNDLDATIMER;time to update?AND#1BNEDOAUD3LDANOTVOL;volumeORA#$A}0STAAUDC2DECNOTVOL;lower volumeBPLDOAUD3DECNOTNUM;next noteBPLNEXNOTZERTUNEON;kill tuneSTANOTVOLSTA}NOTNUMBEQLOWSNDNEXNOTLDXNOTNUMLDANOTES,XSTAAUDF2LDX#5;note lengthCMP#60;long note?BNESHNOTELDX#10}SHNOTESTXNOTVOLBNEDOAUD3NOTESDB60,72,60,72,91,121LOWSNDLDALOWESTBEQZERLOWSTAAUDF2LDA#$A8ZERLOWSTAAUDC2}DOAUD3LDASHUTLESUB#2BEQNOBLASLDACHOHIT;a chopper hit?BEQENGSNDSTAAUDF3MOV#$A8,AUDC3ZERCHOHITBEQD}OAUD4ENGSNDLDACHONSCBEQNOBLASLDASHUTLEBEQCHOSNDLDACHONSC;use for volumePHAORA#$C0STAAUDC3PLAASLA}ASLAASLAADD#120STAAUDF3BNEDOAUD4CHOSNDINCBLASNDLDABLASNDAND#$0FSTABLASNDTAXLDABLAFRQ,XSTAA}UDF3LDACHONSCCLCADCBLACNT,XNOBLASSTAAUDC3* lots of sound effects hereDOAUD4ZERAUDC4;make sureLDACHUSND}BEQCKRIPTAXLDACHUFRQ-1,XSTAAUDF4LDACHUCNT-1,XSTAAUDC4DECCHUSNDCKRIPLDARIPSND;ripping soundBEQCKYELL}STAAUDF4TAXLDARIPCNT-1,XSTAAUDC4DECRIPSNDCKYELLLDASCREAMBEQCKBWOPTAXLDASCRFRQ-1,XSTAAUDF4LDASC}RCNT-1,XSTAAUDC4DECSCREAMCKBWOPLDABWOOOPBEQCKBINGASLAASLAASLASTAAUDF4MOV#$A6,AUDC4DECBWOOOPCKB}INGLDABINGS;bing sound?BEQENDVBIMOV#80,AUDF4DECBINGSLDABINGSAND#$0FORA#$A0STAAUDC4ENDVBIJMPSYSVBV};exit VBISCRCNTDB$A3,$A4,$A5,$A7,$A9,$A8DB$A7,$A6,$A8,$AASCRFRQDB4,6,9,11,15,12,17,13,19,14RIPCNTDB12,10,8,6,5,4},3,2,2,1CHUCNTDB$45,$47,$49,$4B,$4D,$4FCHUFRQDB10,14,18,22,26,30BLAFRQDB10,11,12,13,14,13,12,11,10DB9,8,7,6,7,8,}9BLACNTDB3,2,1,0,3,2,1,0,2,1,0,2DB2,0,1,0COS15=$E1COS30=$DDCOS45=$B4COS60=$80COS75=$42COS90=0COS105}=0-COS75COS120=0-COS60COS135=0-COS45COS150=0-COS30COS165=0-COS15SIN15=COS105SIN30=COS120SIN45=COS135S}IN60=COS150SIN75=COS165SIN90=0-$100COSDECDBLOW COS165,LOW COS150DBLOW COS135,LOW COS120DBLOW COS105,LOW COS}90DBLOW COS75,LOW COS60DBLOW COS45,LOW COS30DBLOW COS15COSINTDBHIGH COS165,HIGH COS150DBHIGH COS135,HIGH COS12}0DBHIGH COS105,HIGH COS90DBHIGH COS75,HIGH COS60DBHIGH COS45,HIGH COS30DBHIGH COS15SINDECDBLOW SIN15,LOW SIN30}DBLOW SIN45,LOW SIN60DBLOW SIN75,LOW SIN90DBLOW SIN75,LOW SIN60DBLOW SIN45,LOW SIN30DBLOW SIN15SININTDBHIGH} SIN15,HIGH SIN30DBHIGH SIN45,HIGH SIN60DBHIGH SIN75,HIGH SIN90DBHIGH SIN75,HIGH SIN60DBHIGH SIN45,HIGH SIN30DB}HIGH SIN15SCORLNDB0,0,CHCOM OR COLMSK,0,0DB$10 OR COLMSK,0,0,0,0,0DBCHCOL OR COLMSK,0,0DBCHPER OR COLMSK,0,0,0,}0,0TIME=SCORLN+9;center it* Pictures of things...* Gun at anglesGUNPICDB$F8,$F8,$00,$00DB$78,$F0,$40,$00DB}$38,$70,$60,$00DB$38,$70,$70,$20DB$38,$38,$70,$70DB$38,$38,$38,$38;verticalDB$38,$38,$1C,$1CDB$38,$1C,$1C,$08}DB$38,$1C,$0C,$00DB$3C,$1E,$04,$00DB$3E,$3E,$00,$00BASPICDB$38,$7C,$7C,$FE,$FE,$FE* Paratrooper imagesPARLEF}DB$00,$00,$02,$2A,$02,$28DB0,0DB$0F,$3F,$30,$2A,$02,$28DB0,0,0,0,0,0,0,0,0,0DB0,0,$22,$0A,$02,$28,0,0PARRIGDB}$00,$00,$80,$A8,$80,$28DB0,0DB$F0,$FC,$0C,$A8,$80,$28DB0,0,0,0,0,0,0,0,0,0DB0,0,$88,$A0,$80,$28,0,0DIRECDB0CH}ODIRDB0-1,1,0* Level databaseLEVEXPDB70,90,65,80,80,80,80,70DB80,80,90,80,40,70,30,50LEVRATDB70,30,65,30,50,45,}40,35DB30,25,21,18,14,11,8,5LEVCHADB10,20,30,30,40,40,50,50DB60,60,70,70,80,90,100,110LEVFALDB$FF,$C0,$B0,$A0DB}$90,$70,$50,$30LEVBOMDB35,30,25,20,15,10,5,3LEVVELDB$BF,$3F,$1F,$14;speedLEVCORDB20,34,44,54;cordLEVSHODB18,11}ALTVERDB8,8,22,22,36,36,50,50* Explosion databaseEXPLIVDSNUMEXP+1EXPXPDS64EXPYPDS64EXPXIDS64EXPYIDS64EX}PXACDS64EXPYACDS64EXPDIRDS64* Shot databaseSHOLIVDSNUMSHO+1;exists?SHXINTDS16;position on screenSHYINTDS}16SHXDECDS16SHYDECDS16SHVDECDS16;for gravitySHVINTDS16* Paratrooper databasePARTYPDSNUMPAR+1;D3=chute D2}=landed D0=existsPARVELDS20;countdown to inc'PARSPDDS20PARVERDS20;vertical positionLANDEDDS20;landed on ground}ROOFDS20;height of roofs* Chopper databaseDS2;just to be safeCHOVELDSNUMCHO+1;countdownDS2CHOSPDDS8;res}et valueDS2CHOTIMDS8DS2CHOCOLDS8;chopper colorDS2BASCOL=CHOCOL+NUMCHO+1;colorCHOPOSDS8DS2BASPOS=}CHOPOS+NUMCHO+1;gunCHOLIVDS8DS2KILLDS8;resistance to shotDS2* The four bombs are misslesBOMLIVDSNUMBOM+1}BOMXPDS4BOMVELDS4;rate of fallBOMSPDDS4BOMYPDS4BOMYIDS4BOMYACDS4BOMDIRDS4;direction* Screen memory lo}okupSCRLODSYMAX+1;memory pointersSCRHIDSYMAX+1* And that's all she wrote!ENDINITdirection* Screen memory lo`dX; DYNAMIC.SRCnX;x#X; *****************************#X; * *#X; * VBI ROUTINE } *#X; * for *#X; * "DYNAMIC DISPLAYS" *#X; * *#X; ********}*********************X;X; SYNTAX: A=USR(1547,N,T,A)X; X; "N" is # of character sets"X; "T" is timer value (1 - 2}55) X; "A" is adr of 1st char setX;FX;"X;, X; EQUATES6 X; -------@X;JTABLE TNUMSETS ^}INDEX h TIME rX;| RTCLOK CHBASSETVBV\XITVBVbX;X; INITIALIZEX; ----------X};7;;# of arguments7;;ignore HI byte7;;# of char setsPNUMSETS;;store it7;;ignore HI byte7;;get timer value}PTIME;;and store it%>;;initialize table index7;;HI byte of char set adr&LOAD0PTABLE8;;put in table:3;;incr}ement table indexD)NUMSETS;;all done loading?NFSETVBI;;not yetX,;;prepare for additionbO>;;+4 to adr in AlHLOA}D;;go store itv SETVBI7;;ignore LO byteQ>;;zero accumulatorPINDEX;;initialize indexPRTCLOK;;initialize time}rQ>;;deferred mode VBI$>;;MSB of VBI handler%>9;;LSB of VBI handler SETVBV;;initialize VBI:;;back to BAS}ICX;X; VBI HANDLERX; -----------X;5;;save accumulator A;;load A from X5;;save X register QRTCLOK;;get }timer value*RTIME;;time to make switch?4HOUT1;;nope> Q>;;yep!HPRTCLOK;;reinitialize clockR$$INDEX;;initialize t}able pointer\ QTABLE9;;get adr of char setfPCHBAS;;and switch 'emp2;;increment pointerz(NUMSETS;;at end?HOUT;;n}ot yet$>;;reinitialize pointerOUT&INDEX;;store pointerOUT17;;get value for X>;;and restore it7;;res}tore accumulator!XITVBV;;all done!OUT&INDEX;;store pointerOUT17;;get value for X>;;and restore it7;;res&EiͩkΩ͙kCop j`j {j`Hi͝Νh`}L"UNEM:D"NURͩkΩ͙kCop j`j {j`Hi͝Νh`op QQQQQQQQQ1Q1Q1Q1Q1Q1Q1Q1Q2Q2Q3Q3Q4Q5Q6Q8Q13Q56Q56Q75Q75JBLXLAPNJBEGI}@@@@@@@ @ @ @ @ @ B@@}@ @%@0@6@@@P@`@A0A`AaARAU@@} @!" (#A$U(%}& '@(@Q)*Br6-@6-'6}-@36-@?6-@K6-@W6-@c6-@ o6-@{6-@6-@6-@6-@}6-B6-@6-@6-@ 6-@%6-@06-@66-@@6-@P'6-@`}36-@?6-A0K6-A`W6-Aac6-ARo6-AUu6- B   >-@6}?P%-632%&7 ; >$ :);,;,;,;,;A,;,:D:*.* 7 -7(#} '#6. ' 7<,4FREE W 6-%6.7<,#67<,.}.367<,.7<,;6.|I67B:,%,.W67B:,%,.567<,.(-B:,(7<,4 567<,..3 6.=:,} &67<,.7<,367<,.0$E @ A7<,4DUP)7<,4MEM)7<,4AUTE (7<,4D}AT 2 () <?  ;7<,4DUP)7<,4MEM)7<,4AUT? F7<,4DAT P (}7<,)| WB-+',% |$-+',%-(|9-+',%B(|ZN.(#| } |N( |  |\`.(#49(`( NOTE: DATA FILES NOT} LISTED.* -(-*( Π3 -- #+-/ 3    P:,}  "6.7<, AE> "6.7+&,$%<+&,$%,& 37<,4 >6.7<,7<,4DOS.* 6.}-B:,*7<,4 AH67B:,%,.7<,   6. - (? 6.D1:67B:,%,.+.(LOADING} 1(; A?%( CANNOT RUN ( *-APAP#2'' *%'5+6-F:,%F:,$AV%-}&@q5%B'3%@$@e"%F:,3%@&F:,L'# 000#0`'c ( .}....4( COMPUTING`($ 򠳸c$D:MENU#0`'c ( .]